home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / arexx / zedrexx.lha / ZedREXX / AboutSDK / zSample.c < prev   
C/C++ Source or Header  |  1994-08-08  |  9KB  |  302 lines

  1. /* zSample.c
  2.  * Copyright (c) 1993-1994 Reality Check, Inc.
  3.  * Written by David N. Junod
  4.  *
  5.  * This is a sample of how a C program can interface to the
  6.  * same library that the ZedREXX REXX Language Extension uses.
  7.  *
  8.  * This requires the header files that are included with
  9.  * the ZedREXX SDK.  The SDK does NOT come with the ZedREXX
  10.  * registration, but is instead an additional product
  11.  * available through Reality Check, Inc.  Direct inquiries
  12.  * to David N. Junod.
  13.  *
  14.  */
  15.  
  16. /*****************************************************************************/
  17.  
  18. #include <dos/dos.h>
  19. #include <exec/types.h>
  20. #include <exec/memory.h>
  21. #include <exec/execbase.h>
  22. #include <exec/libraries.h>
  23. #include <graphics/text.h>
  24. #include <libraries/diskfont.h>
  25. #include <rci/rciface.h>
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <string.h>
  29.  
  30. #include <clib/dos_protos.h>
  31. #include <clib/diskfont_protos.h>
  32. #include <clib/exec_protos.h>
  33. #include <clib/graphics_protos.h>
  34. #include <clib/utility_protos.h>
  35. #include <clib/rciface_protos.h>
  36.  
  37. #include <pragmas/dos_pragmas.h>
  38. #include <pragmas/diskfont_pragmas.h>
  39. #include <pragmas/exec_pragmas.h>
  40. #include <pragmas/graphics_pragmas.h>
  41. #include <pragmas/utility_pragmas.h>
  42. #include <pragmas/rciface_pragmas.h>
  43.  
  44. /*****************************************************************************/
  45.  
  46. struct Library *SysBase, *DOSBase, *GfxBase, *DiskfontBase, *UtilityBase;
  47. struct Library *RCIFaceBase;
  48.  
  49. /*****************************************************************************/
  50.  
  51. struct TextAttr topazAttr = {"topaz.font", 8,};
  52. struct TextAttr helvAttr = {"helvetica.font", 13,};
  53.  
  54. /*****************************************************************************/
  55.  
  56. /* This is our user interface description, the exact same as in a ZedREXX
  57.  * script.  In fact, usually you would prototype your user interface in
  58.  * ZedREXX and then convert it to C. */
  59. STRPTR data[] =
  60. {
  61. "zInterface zSample",
  62.     "zWindow Main Label=\"zSample\" Open Centered Vertical CloseEvent Justification=Center Alignment=Center",
  63.     "zMenu Project",
  64.         "zObject Button IconM Label=\"&Iconify\" Cause=\"zDoMethod zSample Deactivate\"",
  65.         "zObject Line",
  66.         "zObject Button Quit Label=\"&Quit\" SelectEvent",
  67.     "zEndMenu",
  68.     "zObject TextDisplay Value=\"zHello zSilly zWorld\" Justification=Center",
  69.     "zObject Line",
  70.     "zObject Button OK Label=\"&OK\" SelectEvent",
  71.     "zEndWindow",
  72. "zEndInterface"
  73. };
  74.  
  75. /*****************************************************************************/
  76.  
  77. /* Functions used by our user interface */
  78. ULONG HOOK QuitF (PA0 struct zHook *h, PA1 CmdP c, PA2 struct EventMsg *em);
  79. ULONG HOOK DefaultF (PA0 struct zHook *h, PA1 CmdP c, PA2 struct EventMsg *em);
  80.  
  81. /*****************************************************************************/
  82.  
  83. /* The function table used by our user interface */
  84. static struct Cmd cmdArray[] =
  85. {
  86.     /* The following is sent when the Quit menu item is selected */
  87.     {"Quit_Select",    QuitF,    NULL, ",", 1,},
  88.  
  89.     /* The following is sent when the Main window is closed */
  90.     {"Main_Close",    QuitF,    NULL, ",", 1,},
  91.  
  92.     /* The following is sent when closed by Exchange */
  93.     {"zSample_Quit",    QuitF,    NULL, ",", 1,},
  94.     {NULL,},
  95. };
  96.  
  97. static struct Cmd DefaultCmd = {"Default", DefaultF, NULL, "ATTRS/F", 1,};
  98.  
  99. /*****************************************************************************/
  100.  
  101. /* Global data used by our application */
  102. typedef struct GlobalData
  103. {
  104.     APTR     gd_IH;
  105.     ULONG     gd_Going;
  106.  
  107. } GlobalData, *GlobalDataP;
  108.  
  109. /*****************************************************************************/
  110.  
  111. /* The "main" function should be the only function that contains
  112.  * direct OS calls.  ZedREXX applications are portable to OS/2, Windows
  113.  * and MS-DOS.  ZedREXX is the simplistic multi-platform toolkit that
  114.  * Reality Check has to offer.  For larger products, the Viper Toolkit
  115.  * is recommended. */
  116. LONG main (void)
  117. {
  118.     LONG failureLevel = RETURN_FAIL;
  119.     struct WBStartup *wbm = NULL;
  120.     LONG failureCode = 0;
  121.     struct Process *pr;
  122.  
  123.     ULONG error, res, res2;
  124.     struct EventMsg *em;
  125.     ULONG zsig, sigr;
  126.     GlobalDataP gd;
  127.     APTR ih;
  128.  
  129.     struct TextAttr *ta = &topazAttr;
  130.     struct TextFont *tf;
  131.  
  132.     SysBase =  (*((struct Library **) 4));
  133.  
  134.     /* I don't like using compiler startup code */
  135.     pr = (struct Process *) ((struct ExecBase *)SysBase)->ThisTask;
  136.     if (!(pr->pr_CLI))
  137.     {
  138.     WaitPort (&pr->pr_MsgPort);
  139.     wbm = (struct WBStartup *) GetMsg (&pr->pr_MsgPort);
  140.     }
  141.  
  142.     if (SysBase->lib_Version < 37)
  143.     {
  144.     failureCode = ERROR_INVALID_RESIDENT_LIBRARY;
  145.     }
  146.     else if (gd = AllocVec (sizeof (struct GlobalData), MEMF_CLEAR))
  147.     {
  148.     /* Open ROM libraries */
  149.     DOSBase = OpenLibrary ("dos.library", 37);
  150.     GfxBase = OpenLibrary ("graphics.library", 37);
  151.     DiskfontBase = OpenLibrary ("diskfont.library", 37);
  152.     UtilityBase = OpenLibrary ("utility.library", 37);
  153.  
  154.     /* Open the RCI user interface library */
  155.     if (RCIFaceBase = OpenLibrary ("rciface.library", 0))
  156.     {
  157.         /* The font must be loaded into RAM before it can be used. */
  158.         if ((tf = OpenFont (&helvAttr)) == NULL)
  159.         tf = OpenDiskFont (&helvAttr);
  160.         if (tf)
  161.         ta = &helvAttr;
  162.  
  163.         /* Open the user interface */
  164.         if (ih = zOpenInterface (
  165.                     ZIA_Interface,         (ULONG) data,
  166.                     ZIA_Functions,         (ULONG) cmdArray,
  167.                     ZIA_DefaultFunction,     (ULONG) & DefaultCmd,
  168.                     ZIA_FunctionData,     gd,
  169.                     ZIA_TextAttr,         ta,
  170.                     TAG_DONE))
  171.         {
  172.         failureLevel = RETURN_OK;
  173.  
  174.         /* Initialize our global variables. */
  175.         gd->gd_IH = ih;
  176.         gd->gd_Going = TRUE;
  177.  
  178.         /* Get the signal bit for the user interface */
  179.         zsig = 1L << zInterfaceSignal (ih);
  180.  
  181.         /* Activate the user interface */
  182.         res = zSendCommand (ih, "zDoMethod zSample Activate", &res2);
  183.  
  184.         /* Clear a few necessaries */
  185.         res = res2 = 0;
  186.  
  187.         Printf ("Activate the shell that started this example and press ^F\n");
  188.  
  189.         /* Look until there is no reason to continue */
  190.         while (gd->gd_Going)
  191.         {
  192.             /* Wait for something to happen */
  193.             sigr = Wait (zsig | SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_E | SIGBREAKF_CTRL_F);
  194.  
  195.             /* Was it a RCI message */
  196.             if (sigr & zsig)
  197.             {
  198.             /* Pull the message */
  199.             while (em = zGetEventMsg (ih))
  200.             {
  201.                 /* Handle the message */
  202.                 zInterpret (ih, em, &error);
  203.  
  204.                 /* Reply to the message */
  205.                 zReplyEventMsg (ih, em, res, res2);
  206.             }
  207.             }
  208.  
  209.             /* Was it a ^C */
  210.             if (sigr & SIGBREAKF_CTRL_C)
  211.             gd->gd_Going = FALSE;
  212.  
  213.             /* Was it a ^E */
  214.             if (sigr & SIGBREAKF_CTRL_E)
  215.             res = zSendCommand (ih, "zDoMethod zSample Activate", &res2);
  216.  
  217.             /* Was it a ^F */
  218.             if (sigr & SIGBREAKF_CTRL_F)
  219.             {
  220.             UBYTE otitle[64], buffer[32];
  221.             LONG i;
  222.  
  223.             /* Get the current title */
  224.             zGetAttr (ih, "Main", "Label", otitle, sizeof (otitle));
  225.  
  226.             Printf ("Click on the OK button to return to the main loop\n");
  227.  
  228.             i = 1;
  229.             while (i)
  230.             {
  231.                 /* Wait around for a little while */
  232.                 Delay (10);
  233.  
  234.                 /* Change the window title bar to show the current value */
  235.                 sprintf (buffer, "%06ld", i++);
  236.                 zSetAttr (ih, "Main", "Label", buffer);
  237.  
  238.                 /* See if anything has happened */
  239.                 if (zCheckForEvent (ih))
  240.                 i = 0;
  241.             }
  242.  
  243.             /* Restore the original title */
  244.             zSetAttr (ih, "Main", "Label", otitle);
  245.             }
  246.         }
  247.  
  248.         /* Close the user interface */
  249.         zCloseInterface (ih);
  250.         }
  251.         CloseFont (tf);
  252.         CloseLibrary (RCIFaceBase);
  253.     }
  254.     else
  255.     {
  256.         Printf ("couldn't open rciface.library\n");
  257.     }
  258.  
  259.     /* Close libraries */
  260.     CloseLibrary (UtilityBase);
  261.     CloseLibrary (DiskfontBase);
  262.     CloseLibrary (GfxBase);
  263.     CloseLibrary (DOSBase);
  264.  
  265.     FreeVec (gd);
  266.     }
  267.     else
  268.     failureCode = ERROR_NO_FREE_STORE;
  269.  
  270.     if (wbm)
  271.     {
  272.     Forbid ();
  273.     ReplyMsg ((struct Message *) wbm);
  274.     }
  275.     pr->pr_Result2 = failureCode;
  276.     return (failureLevel);
  277. }
  278.  
  279. /*****************************************************************************/
  280. /*****************************************************************************/
  281. /*****************************************************************************/
  282.  
  283. ULONG HOOK QuitF (PA0 struct zHook * h, PA1 CmdP c, PA2 struct EventMsg * em)
  284. {
  285.     GlobalDataP gd = (GlobalDataP) h->h_UserData;
  286.  
  287.     /* Tell peoples what is going on around here */
  288.     Printf ("quit : win='%s', obj='%s', event='%s'\n", em->em_Window, em->em_Object, em->em_Event);
  289.  
  290.     gd->gd_Going = FALSE;
  291.     return 1;
  292. }
  293.  
  294. /*****************************************************************************/
  295.  
  296. ULONG HOOK DefaultF (PA0 struct zHook * h, PA1 CmdP c, PA2 struct EventMsg * em)
  297. {
  298.     Printf ("def : win='%s', obj='%s', event='%s'\n", em->em_Window, em->em_Object, em->em_Event);
  299.  
  300.     return 1;
  301. }
  302.